package cn.springboot.utils;

import java.security.MessageDigest;

import org.apache.commons.lang.StringUtils;


/**
 * @author liufl E-mail:Huberier@allpyra.com
 * @version 创建时间：2017年8月24日 下午3:24:36
 * 类说明
 */
public class MD5Util {
	//公盐
    private static final String PUBLIC_SALT = "sdf!@223dfABQE49" ;
    //十六进制下数字到字符的映射数组  
    private final static String[] hexDigits = {"0", "1", "2", "3", "4",  
        "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
     
    /**
     * 用户密码加密，盐值为 ：私盐+公盐
     * @param  password 密码
     * @param  salt 私盐
     * @return  MD5加密字符串
     */
    public static String encryptPassword(String password,String salt){
        return encryptUTF8(PUBLIC_SALT+password+salt);
    }
     
    /**
     * md5加密算法
     * @param  originString
     * @return 
     */
    public static String encryptUTF8(String str){
    	return encrypt(str, "utf-8");
	}
    public static String encrypt(String str,String charset){  
        if (str != null){  
            try{  
                //创建具有指定算法名称的信息摘要  
                MessageDigest md = MessageDigest.getInstance("MD5");  
                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算  
                byte[] results = md.digest(str.getBytes());  
                if(StringUtils.isBlank(charset)){
                	results = md.digest(str.getBytes(charset));  
                }
                //将得到的字节数组变成字符串返回  
                String resultString = byteArrayToHexString(results);  
                return resultString.toLowerCase(); 
            } catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
        return null;  
    } 
     
    /**  
     * 转换字节数组为十六进制字符串 
     * @param     字节数组 
     * @return    十六进制字符串 
     */  
    private static String byteArrayToHexString(byte[] b){  
        StringBuffer resultSb = new StringBuffer();  
        for (int i = 0; i < b.length; i++){  
            resultSb.append(byteToHexString(b[i]));  
        }  
        return resultSb.toString();  
    }  
       
    /** 将一个字节转化成十六进制形式的字符串     */  
    private static String byteToHexString(byte b){  
        int n = b;  
        if (n < 0)  
            n = 256 + n;  
        int d1 = n / 16;  
        int d2 = n % 16;  
        return hexDigits[d1] + hexDigits[d2];  
    }
    
    public static void main(String[] args) {
    	System.out.println(MD5Util.encryptUTF8(MD5Util.encryptUTF8("hello")));
	}
}

